//
//  CZStatusDetailViewController.swift
//  GZWeibo666
//
//  Created by apple on 15/12/1.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit

import SVProgressHUD


/// MARK: 管理 cell重用标示
enum CZDetilReuseIdentifier: String {
    case DetailNoDataCell = "DetailNoDataCell"
    case DetilCommentCell = "DetilCommentCell"
}
/// MARK:微博详情的控制器
class CZStatusDetailViewController: UIViewController ,UITableViewDelegate,UITableViewDataSource {
    /// MARK :属性
    //    微博的模型
    var status: CZStatus?
//    评论列表的模型
    var comments: [CZStatusComments] = [CZStatusComments]()
    
    init(status:  CZStatus){
        super.init(nibName: nil, bundle: nil)
        self.status = status
        print("status: \(status)")
        
        bottonView.status = status
        
        prepareUI()
        prepareTableView()
        
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    // MARK: - 准备UI
    /// 准备UI
    private func prepareUI() {
        // 添加子控件
        view.addSubview(statusTableView)
        view.addSubview(bottonView)
        bottonView.delegate = self
        
        // 添加约束
        statusTableView.translatesAutoresizingMaskIntoConstraints = false
        bottonView.translatesAutoresizingMaskIntoConstraints = false
        
        // 水平
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tb]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tb" : statusTableView]))
        
        // bottonnView水平
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[bv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["bv" : bottonView]))
        
        
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[tb]-0-[bv(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tb" : statusTableView, "bv": bottonView]))
        
    }
    
    
    private func prepareTableView() {
        statusTableView.delegate = self
        statusTableView.dataSource = self
        tabBarController?.tabBar.hidden = true
        
        // 注册cell,需要注册2个,根据显示的模型返回对应类型的cell
        statusTableView.registerClass(CZStatusNormalCell.self, forCellReuseIdentifier: CZStatusReuseIdentifier.NormalCell.rawValue)
        statusTableView.registerClass(CZStatusForwardCell.self, forCellReuseIdentifier: CZStatusReuseIdentifier.ForwardCell.rawValue)
        statusTableView.registerClass(CZCommentTableViewCell.self, forCellReuseIdentifier: CZDetilReuseIdentifier.DetailNoDataCell.rawValue)
        statusTableView.registerClass(CZDetailCommentCell.self, forCellReuseIdentifier:CZDetilReuseIdentifier.DetilCommentCell.rawValue)
        // 设置背景
        statusTableView.backgroundColor = UIColor(white: 0.9, alpha: 1)
        statusTableView.estimatedRowHeight = 300
        statusTableView.tableFooterView = UIView()
        
        statusTableView.addInfiniteScrollingWithActionHandler { () -> Void in
            // 加载更多数据
            print("加载更多评论")
            self.loadMoreComment()
        }
        
    }

    
    /// MARK: - UITableView的代理方法
    /// 返回对应cell的行高
    /// 发现行高调用比较频繁,导致多次调用.计算一次,然后保存起来,下次直接返回缓存的行高
     func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.section == 0 {
        // 先看看有没有缓存的行高,如果有缓存行高,直接拿来用,没有的话,在计算,并缓存起来
        // 获取对应的模型
        if status!.rowHeight != nil {
            return status!.rowHeight!
        }
        // 能到下面来,说明没有缓存的行高
        // 获取cell, 计算行高,并不会显示出来
        let cell = tableView.dequeueReusableCellWithIdentifier(status!.cellId()) as! CZStatusCell
        let rowHeight = cell.rowHeight(status!)
        status!.rowHeight = rowHeight
        return rowHeight
        }else {
            // 根据自动约束计算高度
            return UITableViewAutomaticDimension
        }
    }
    
    //    返回多少组
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }
    
    //    返回多少行
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return 1
        } else {
            if comments.count == 0 {
                return 1
            } else {
                // 返回 评论数量
                return comments.count
            }
        }

    }
    
     //    返回cell
     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            
            // 获得模型,模型最清楚要显示什么样的cell
            let cell = tableView.dequeueReusableCellWithIdentifier(status!.cellId()) as! CZStatusCell
            // 给cell设置模型
            cell.status = status
            cell.cellDelegate = self
            
             return cell
        }  else   {
            // 如果没有数据显示 `还没有人评论`
            if comments.count == 0 {
                // 根据重用标示获取对应的cell
                let cell =  tableView.dequeueReusableCellWithIdentifier(CZDetilReuseIdentifier.DetailNoDataCell.rawValue) as! CZCommentTableViewCell
                cell.message = "没有人评论"
                return cell
                
            } else {
                // 获取 评论模型
                let commentModel = comments[indexPath.row]
                let cell = tableView.dequeueReusableCellWithIdentifier(CZDetilReuseIdentifier.DetilCommentCell.rawValue) as! CZDetailCommentCell
                // 给cell设置 评论模型, cell根据 评论模型 显示 评论内容
                cell.model = commentModel
                return cell
            }
        }
    }
//    每组的头部
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        if section == 1 {
            return detailHeaderView
        }else{
            return nil
        }
    }
//    每组头部的高度
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if section == 1 {
            return 44
        }else{
            return 0
        }
    }
    
    /// MARK:  懒加载
    lazy var bottonView: CZStatusBottomView = CZStatusBottomView()
    
    
    //    微博的tableView
    lazy var statusTableView: UITableView = UITableView(frame: CGRectZero, style: UITableViewStyle.Plain)
    
    
    /// headView
    private lazy var detailHeaderView: CZDetailHeaderView = {
        let view = CZDetailHeaderView()
        view.delegate = self
        view.status = self.status
        return view
        }()
}


/// MARK: - 实现多个代理方法
extension  CZStatusDetailViewController: CZDetailHeaderViewDelegate , CZStatusCellDelegate ,CZStatusBottomViewDelegate {
    /// MARK: - 头部view的代理
    func detailHeaderViewClick(headerView: UIView) {
        print("加载最新评论")
        loadNewComment()
    }
    
    ///  - 加载最新评论
    private func loadNewComment() {
        let since_id = comments.first?.id ?? 0
        
        // 添加 正在加载数据的cell
        let loadCommentModel = CZStatusComments(loading: true)
        comments.insert(loadCommentModel, atIndex: 0)
        // 刷新
        statusTableView.reloadData()
        // 滚动到第1组第0个cell
        statusTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 1), atScrollPosition: UITableViewScrollPosition.Top, animated: false)
        
        CZStatusComments.loadComments(status!.id, since_id: since_id, max_id: 0) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            
            // 移除正在加载数据的cell
            self.comments.removeFirst()
            
            if error != nil {
                print("加载最新评论失败: \(error)")
                SVProgressHUD.showErrorWithStatus("加载最新评论失败")
                // 刷新
                self.statusTableView.reloadData()
                return
            }
            
            print("加载最新评论成功:\(comments?.count), next_cursor: \(next_cursor)")
            self.status!.comments_count = total_number!
            // 判断
            if comments != nil && comments?.count > 0 {
                // 将新获取到的数据拼接
                self.comments = comments! + self.comments
            }
            // 重新刷新数据
            self.statusTableView.reloadData()
        }
    }
    
    // MARK: - 加载更多评论
    private func loadMoreComment() {
        CZStatusComments.loadComments(status!.id, since_id: 0, max_id: comments.last?.id ?? 0) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            // 停止上拉加载更多数据动画
            self.statusTableView.infiniteScrollingView.stopAnimating()
            
            if error != nil {
                SVProgressHUD.showErrorWithStatus("加载评论失败")
                return
            }
            
            print("加载评论成功:\(comments?.count), next_cursor: \(next_cursor)")
            self.status!.comments_count = total_number!
            self.statusTableView.showsInfiniteScrolling = next_cursor != 0
            
            // 判断
            if comments != nil && comments?.count > 0 {
                // 将新获取到的数据拼接在现有数据的后面
                self.comments = self.comments + comments!
                // 重新刷新数据
                self.statusTableView.reloadData()
            }
        }
    }
  
   
    /// MARK: - 转发微博的方法
    func retweetStatusClick(clickStatus: CZStatus) {
        let detailVC = CZStatusDetailViewController(status: clickStatus)
        detailVC.hidesBottomBarWhenPushed = true
        navigationController?.pushViewController(detailVC, animated: true)
    }

    /// MARK:底部（评论）view的代理方法
    //    点击评论
    func commentButtonClick(status: CZStatus) {
        print("点了吗？")
        let commentVC = CZForwardViewController(controllerType: CZForwardViewControllerType.Comment)
        commentVC.status = status
        presentViewController(UINavigationController(rootViewController: commentVC), animated: true, completion: nil)
    }
    
    //    点击转发
    func forwardButtonClick(status: CZStatus){
        print("点击转发")
        let commentVC = CZForwardViewController(controllerType: CZForwardViewControllerType.Repost)
        commentVC.status = status
        presentViewController(UINavigationController(rootViewController: commentVC), animated: true, completion: nil)
    }
}





